package com.cskaoyan.javase.method._0introduction;

/**
 * 全新的代码,用方法来复用代码
 *
 * 引例，现在有三个需求：
 * 编写程序，计算10+20，并输出结果
 * 编写程序，计算111+222，并输出结果
 * 编写程序，计算333+444，并输出结果
 *
 * 针对以上需求,使用方法来求解
 *
 * 方法的语法:
 * [修饰符列表] 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 在逐一解释方法的语法之前,我们要先记住两个概念:
 *      1.我们把  "[修饰符列表] 返回值类型 方法名(形参列表)" 连起来称之为方法头或者方法的声明.
 *      2.我们把  "方法名(形参列表)" 连起来称之为方法的签名.(方法的签名是独特的代表一个方法)
 * 逐一解释方法的语法部分:
 *      1.修饰符列表,对于方法而言,能够使用的修饰符是很多的.但是限于目前的学习进度,这里我们可以先不管修饰符
 *          我们总是默认方法的修饰符是public static
 *          当然修饰符列表对于方法而言,不是必须的,完全可以省略什么都不写.
 *      2.返回值类型:方法调用结束,返回的结果的数据类型.这个数据类型可以是基本数据类型,也可以是引用数据类型
 *          返回值:指的是方法执行完毕后,给出的结果,就是返回值
 *      3.方法名:方法的名字,它是一个标识符,遵循"小驼峰式"的命名规范,在给方法起名字时,应该尽量"见名知意"
 *          方法名应该能够代表方法的作用,而且由于方法总是在做操作,所以方法名应该尽量用动词
 *          比如求最大值,最小值的方法,应该命名为:
 *          getMaxValue,getMinValue
 *      4.形参列表: 由形式参数组成的列表.
 *          形式参数: 方法在调用时,是可能需要传入参数的.那么这个方法调用时
 *              究竟需要几个参数,究竟需要什么数据类型的参数,都是需要
 *              告诉方法调用者的.
 *              这就是形式参数的作用
 *              所以形式参数的语法是:
 *                  数据类型 形式参数名
 *              其中形式参数名是为了能够在方法中去使用外部传入的参数
 *              从实际意义出发,形参不是一个真正的参数,只是一个形式,它更像一个占位符
 *              与此相对的,在方法调用时,方法传入的具体参数,称之为实际参数(实参)
 *              实参是一个真正的参数,是一个值.
 *              总结: 形参 vs 实参
 *              形参是占位符,写在方法声明中,不是一个真正的参数,可以在方法体中被使用,表示方法的参数传入后的使用方式
 *              实参是一个真正的参数,在方法调用时,传入方法
 *       5.方法体: 方法完成功能,实现功能,需要执行的语句集合,就是方法体.
 *
 * 语法会了以后,我们开始尝试定义方法
 * 方法定义的位置:
 *      首先必须在类体中,其次必须定义在其他方法的外部
 *      方法是不能嵌套定义的
 *
 * 在方法声明中,如果返回值类型的位置,明确了需要返回值,那么在方法体中,就必须明确的指出这个返回值
 *      语法: return 值(表达式);
 *
 * 方法定义完毕后,我们可以尝试启动main方法
 * main方法是程序的入口方法,其他方法要想被调用就必须直接地或者间接地在main方法中调用
 * 方法不(在main方法中)调用,不执行
 *
 * 在同一个类中,在main方法中,调用同类中的static修饰的方法,调用方式是:
 *      方法名(实参列表);
 *
 * 实践中,如果方法是有返回值的,那么操作它的方法调用,就是操作它的返回值!!!
 *
 * 其他细节:
 *      1.Java中的一个类中的方法,是平行的关系,位置不同,不会影响方法调用的结果
 *      2.同类中的,static和static修饰的方法之间可以互相调用,直接用方法名调用即可
 *
 *
 * 总结:如何写一个方法?
 *      1.先想明白写方法的目的是什么,作用是什么:
 *          a.方法的名字
 *          b.方法需要什么参数传入(形式参数列表)
 *          c.方法需要给出什么结果(返回值类型)
 *          以上就可以把方法的声明,方法头写出来
 *      2.具体思考方法体,思考这个方法怎么写,怎么实现
 *
 * @since 14:27
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        // Result of 'NewDemo.sum()' is ignored
        // 方法既然有返回值,那么建议去接收或者使用这个返回值
        int sumValue = sum(10, 20);
        System.out.println(sumValue);

        int num1 = 100;
        int num2 = 200;
        System.out.println(sum(num1, num2));
        System.out.println(sum(num1, num2) + 100);

        System.out.println("-----------------");
        System.out.println(test() + 100);
        // System.out.println(test() - 100);
        System.out.println(test().length());
    }

    // 定义一个方法,来完成求两个int类型数值的和
    public static int sum(int num1, int num2) {
        // Missing return statement
        // Local variable 'sumValue' is redundant
        /*int sumValue = num1 + num2;
        return sumValue;*/
        return num1 + num2;
    }

    // 形参列表为空,意味着这个方法是无参的,调用时无需任何参数
    public static String test(){
        System.out.println(test2());
        return "hello world!";
    }

    // Access can be private 访问权限的问题
    public static int test2(){
        return 1;
    }

}


